Tänaes praktikum on esimene kahest, kus vaatame kaardiandmeid. Me kasutame kaardiandmete jaoks simple features formaati mida R-s implementeerib pakett nimega sf. Loeme sisse ka paketi osmdata, millega vaatame pärastpoole kuidas tõmmata Open Street Maps kaardiinfot.
library(rgeos)
Loading required package: sp
rgeos version: 0.5-5, (SVN revision 640)
GEOS runtime version: 3.8.1-CAPI-1.13.3
Linking to sp version: 1.4-2
Polygon checking: TRUE
Näidisandmestikuna kasutame Eesti maakondade ja valdade andmestikku.
load("eesti.RData", verbose = T)
Loading objects:
vald
maakond
eesti
Need andmed on formaadis sf, mis on sisuliselt andmetabel, kus on üks veerg (tavaliselt nimdega geometry) milles hoitakse vektorkujul objekti esitust. Lisaks on sellele tabelil eraldi päis mis hoiab informatsiooni andmete tüübi, asukoha ja projektsiooni kohta.
maakond
Simple feature collection with 15 features and 2 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 369548.2 ymin: 6377146 xmax: 739149.6 ymax: 6617809
Projected CRS: Estonian Coordinate System of 1997
First 10 features:
MNIMI MKOOD geometry
1 Saare maakond 0074 MULTIPOLYGON (((454431 6409...
2 Viljandi maakond 0084 MULTIPOLYGON (((621348.6 64...
3 Hiiu maakond 0039 MULTIPOLYGON (((449832.4 65...
4 Harju maakond 0037 MULTIPOLYGON (((497565 6580...
5 Lääne maakond 0056 MULTIPOLYGON (((462065.5 65...
6 Rapla maakond 0071 MULTIPOLYGON (((509334.5 65...
7 Ida-Viru maakond 0045 MULTIPOLYGON (((716681.5 65...
8 Valga maakond 0081 MULTIPOLYGON (((622099.9 64...
9 Tartu maakond 0079 MULTIPOLYGON (((705560 6477...
10 Järva maakond 0052 MULTIPOLYGON (((576673.2 65...
Tunnus geometry võib olla kujul POINT, LINE, POLYGON, MULTIPOINT, MULTILINE ja MULTIPOLYGON. Iga sf objekt sisaldab vaid ühte tüüpi geometry elemente. MULTIPOLYGON tähendab, et tegemist on kaheväärtuselise tulbaga, mille väärtused määravad hulknurga küljed.
Sisuliselt saab sellele andmetabelil teha kõiki operatsioone, mida me saame teha tavalise andmetabeliga.
vald %>%
mutate(Linn = str_detect(ONIMI, "linn"))
Simple feature collection with 79 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 369548.2 ymin: 6377146 xmax: 739149.6 ymax: 6633918
Projected CRS: Estonian Coordinate System of 1997
First 10 features:
ONIMI OKOOD MNIMI MKOOD TYYP geometry Linn
1 Ruhnu vald 0689 Saare maakond 0074 1 MULTIPOLYGON (((454431 6409... FALSE
2 Muhu vald 0478 Saare maakond 0074 1 MULTIPOLYGON (((463418.4 64... FALSE
3 Viimsi vald 0890 Harju maakond 0037 1 MULTIPOLYGON (((544438.3 66... FALSE
4 Saaremaa vald 0714 Saare maakond 0074 1 MULTIPOLYGON (((395602.3 64... FALSE
5 Hiiumaa vald 0205 Hiiu maakond 0039 1 MULTIPOLYGON (((449832.4 65... FALSE
6 Kihnu vald 0303 Pärnu maakond 0068 1 MULTIPOLYGON (((500160.5 64... FALSE
7 Vormsi vald 0907 Lääne maakond 0056 1 MULTIPOLYGON (((458345.9 65... FALSE
8 Viljandi linn 0897 Viljandi maakond 0084 4 MULTIPOLYGON (((591276.3 64... TRUE
9 Kiili vald 0305 Harju maakond 0037 1 MULTIPOLYGON (((543644.9 65... FALSE
10 Tallinn 0784 Harju maakond 0037 4 MULTIPOLYGON (((544048.5 66... TRUE
Andmeid sf formaadis saab visualiseerida ggplot2-ga. Selleks on olemas eraldi funktsioon geom_sf.
Erinevatel kihtidel saab näidata erinevaid andmestikke.
ggplot(maakond) +
geom_sf(fill = "lightblue") +
geom_sf(color = "orange", data = vald %>% filter(MNIMI == "Harju maakond"))
Et geograafilisi andmeid saaks parmeini sildistada on loodud funktsioonid geom_sf_label ja geom_sf_text. Saame kasutada ainult geom_sf_…., sest meil pole x ja y koordinaate ja masin üritab sildi panna lihtsalt objekti (maakond) keskele
Kasutades sama süntaksit nagu me rakendasime võrgustike puhul saame me ka siin siltide arvu vähendada, võttes andmestikust alamhulki.
ggplot(maakond) +
geom_sf(fill = "lightblue") +
geom_sf_label(aes(label = MNIMI), data = ~ .x %>% filter(MNIMI %in% c("Hiiu maakond", "Saare maakond")))
Loomulikult saab pildil muuta ka tausta ja väljanägemist kasutades theme_* funktsioone. Nagu võrgustikegi puhul, on theme_void hea valik, et puhtamaid pilte saada. Kuid ka muud funktsioonid, näiteks theme_bw, töötavad. Meil pole enamasti vaja teada, mis need koordinaadid on täpselt. Sellep on theme_void hea ka.
Et kaart oleks efektsem võib muuta ka muid parameetreid. Näiteks kaardid tumedal taustal näevad tihti välja väga pilkupüüdvad.
Kaartidele lisatakse tihti ka mõõtkava ja nooleke mis näitab kus suunas on põhi. Ka meie joonistatud graafikutel on see võimalik, kasutades paketti ggspatial, ning sealt funktsioone annotation_scale ja annotation_north_arrow. pad_y tõstab noolekest ülespoole
Üks levinumaid kaartide kasutusalasid andmeteaduses on mingi tunnuse järgi värvitud kaardid (i.k cloropeth maps). Eelneva põhjal pole väga raske arvata kuidas nende joonistamine võib käia, kuna saame kasutada sarnaseid ggplot2 nippe nagu eelnevateski praktikumides. Enne aga kui läheme kaartide joonistamise juurde loeme sisse andmestiku, mis kirjeldab koroonavaktsineerimise hetkeseisu vanusegruppides ja soo kaupa kuupäva 18/03/2021 seisuga.
load("vaktsiin.RData", verbose = T)
Loading objects:
vaktsiin
vaktsiin
Selleks, et meil tekiks lihtsam andmestik mida uurida summeerime arvud maakonna kaupa.
v = vaktsiin %>%
group_by(County) %>%
summarize(
TotalCount = sum(TotalCount),
TotalPopulation = sum(Population)
)
v
Nüüd saame selle andmestiku liita olemasolevale maakonna andmestikule. Selleks otstarbeks saab kasutada *_join perekonna käskusid. Need on analoogsed SQL join käskudega ja sinna perekonda kuuluvad.
left_join - jätab alles kõik read vasakpoolsest tabelist
right_join - jätab alles kõik read parempoolsest tabelist
full_join - jätab alles kõik read mõlemast tabelist
inner_join - jätab alles read mis on olemas mõlemas tabelis
Ühendamine käib vaikimis tunnuste alusel millel on sama nimi. Ühendame nüüd tabelid v ja maakond. Pane tähele, et tasub ühedada andmed sf objekti külge mitte vastupidi, sest muidu muutub objekti tüüp.
#Muudame nime, et joini tulp oleks sama nimega (MNIMI)
vm = maakond %>%
left_join(v %>% rename(MNIMI = County))
vm
#Kui nii teeme, nagu siin, siis saab tulemuseks dataframe ja ei saa kasutada kaardi pakette
v %>%
rename(MNIMI = County) %>%
left_join(maakond)
Nüüd saame joonistada kaardi mis on värvitud vaktsineerimiste arvu järgi.
#Vaktsineeritute osakaal kogu maaskonna rahvastikust
ggplot(vm) +
geom_sf(aes(fill = TotalCount/TotalPopulation))
Seda pilti saab modifitseerida kasutades ggplot2-st tuttavaid võtteid.
Andmetabelite ühendamisel peab olema ettevaatlik joiniga, et meie read ei paljuneks. Kui sama maakonna kohta on mitu andmepunkti, siis maakondade tabeli ridu paljundatakse nii palju, et ridade arv klapiks teise andmestikuga. Sellep leidsime alguses TotalCounti jms summeeritud tabeli, kuna vaktsiin tabelis on igas maakonnas erinevate vanusegruppide read jms. Seega igal maakonnal mitu rida.
maakond %>%
left_join(vaktsiin %>% rename(MNIMI = County)) %>%
ggplot() +
geom_sf(aes(fill = TotalCount))
Eesti kohta on palju avaandmeid saadaval Maaameti Geoportaalis. Vektorkujul andmetele viidatakse, kui SHP formaadis andmetele. Vaatame näiteks lehele https://geoportaal.maaamet.ee/est/Ruumiandmed/Eesti-topograafia-andmekogu/Laadi-ETAK-andmed-alla-p609.html
Ja laeme sealt alla SHP faili tehnovõrkude kohta.
Kui me tahame joonistada suuremaid kaarte kui Eesti kohta, näiteks maailmajao või maailma tasemel, siis on heaks allikaks Natural Earth andmebaas, kus on maailma riikide kohta käiv statistika ja nende kujufailid mugavalt kokku pandud. R-s saab sinna ligi paketiga rnaturalearth ning selle funktsiooniga ne_countires.
Sealt saab ka täpsemat administratiivse alamjaotuse infot käsuga ne_states, millele peab andma argumendiks ette riigi. Eesti kohta on see andmestik natuke väikese resolutsiooniga, kuid suuremate riikide jaoks on väga hea.
Open Street Maps (OSM) on avatud vaste Google Mapsile ning sisaldab kõikvõimalikku kaardimaterjali. Inimesed üle maailma täiendavad seda pidevalt, nii et tegu on pidevas arengus oleva andmebaasiga. Infot on seal kaugelt rohkem kui on mõistlik korraga oma arvutisse laadida, seetõttu tuleb OSM andmete kasutamiseks teha päringuid OSM API-le mis saadab täpselt vajalikud andmed. OSM API väljakutsumine ja sealt saabuvate andmete õigesse formaati teisendamine on implementeeritud paketis osmdata. Sellega töötamise süsteem on järgmine. Vaata OSM wikit, et näha, mida erinevad deifnitsioonid ja nimed andmestikus tähendavad jne
osmdata käsuga getbb, mille argumendiks tuleb panna meid huvitav kohanimi mingis formaadis. Näiteks “Tartu”, “Raplamaa”, “Haabersti”.getbb("Narva")
add_osm_feature defineerida mis infot soovitakse saada. Kõikidest tabelitest saab ülevaate funktsiooniga available_features ja konkreetse tabeli alamajotustest available_tagsavailable_features() %>% tail()
available_tags("water")
Mõned kasulikumad tabelid on
- "highway" - kõik teed ja sillad
- "boundary" - piirid (tag "administrative" annab ametlikud piirid
- "building" - kõik hooned
- "water" - kõik siseveekogud: jõed, järved, tiigidKolmandaks tuleb kõik info alla laadida. Selleks on käsud osmdata_sf() %>% unname_osmdata_sf(). See protsess võib aega võtta ja ei pruugi iga kord õnnestuda. Siis proovida uuesti.
Lõpuks saame andmestiku, mis on list erinevatest sf formaadis tabelitest vastavalt objeltitüübile. Selle listi elemendid on
osm_points
osm_lines
osm_polygons
osm_multipoints
osm_multilines
osm_multipolygons
Teeme läbi ühe näite
teed$osm_lines
Simple feature collection with 1756 features and 88 fields
Geometry type: LINESTRING
Dimension: XY
Bounding box: xmin: 26.69676 ymin: 58.36001 xmax: 26.74681 ymax: 58.39059
Geodetic CRS: WGS 84
First 10 features:
osm_id name access addr.city addr.country addr.full addr.housenumber addr.street alt_name amenity
27096547 27096547 Taara pst <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
28906993 28906993 Narva mnt <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394188 29394188 Riia <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394203 29394203 Narva mnt <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394205 29394205 Narva mnt <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394283 29394283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 29394711 Narva mnt <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394713 29394713 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 29420431 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 29420432 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
area bicycle bridge bridge.structure building building.levels colour covered created_by crossing
27096547 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
28906993 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> yes <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> traffic_signals
29420432 <NA> yes yes <NA> <NA> <NA> <NA> <NA> <NA> <NA>
crossing.island cycleway cycleway.both cycleway.left cycleway.right destination.lanes
27096547 <NA> <NA> <NA> <NA> <NA> <NA>
28906993 <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> <NA> <NA> <NA>
29420431 no <NA> <NA> <NA> <NA> <NA>
29420432 <NA> <NA> <NA> <NA> <NA> <NA>
destination.ref.lanes destination.ref.to.lanes destination.to foot footway full_name handrail hgv
27096547 <NA> <NA> <NA> <NA> <NA> Taara puiestee <NA> <NA>
28906993 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 <NA> <NA> <NA> <NA> crossing <NA> <NA> <NA>
29420432 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
highway horse incline int_ref junction lane_markings lanes lanes.backward lanes.forward layer
27096547 residential <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
28906993 trunk <NA> <NA> E 264 <NA> <NA> 2 <NA> <NA> <NA>
29394188 trunk <NA> <NA> E 264 <NA> <NA> <NA> <NA> <NA> <NA>
29394203 trunk <NA> <NA> E 264 <NA> <NA> 1 <NA> <NA> <NA>
29394205 trunk <NA> <NA> E 264 <NA> <NA> 2 <NA> <NA> <NA>
29394283 secondary_link <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 trunk <NA> <NA> E 264 <NA> <NA> 4 <NA> <NA> 1
29394713 tertiary_link <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 footway <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 pedestrian <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 1
length length_unit lines lit maxheight maxspeed maxspeed.type maxweight maxwidth motor_vehicle name.en
27096547 <NA> <NA> <NA> <NA> <NA> 30 <NA> <NA> <NA> <NA> <NA>
28906993 <NA> <NA> <NA> <NA> <NA> 40 <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> <NA> <NA> 50 <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> <NA> <NA> 50 <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> <NA> <NA> 50 <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> <NA> <NA> <NA> 50 <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA> no <NA>
name.zh noname old_name.de oneway oneway.bicycle parking.lane.left parking.lane.right postal_code ramp
27096547 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
28906993 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> yes <NA> <NA> <NA> <NA> <NA>
29420431 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 <NA> yes <NA> <NA> <NA> <NA> <NA> <NA> <NA>
ramp.bicycle ref roof.colour roof.shape seamark.bridge.category segregated service sidewalk
27096547 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
28906993 <NA> 3 <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> 3 <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> 3 <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> 3 <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> 3 <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
sidewalk.both.bicycle sidewalk.both.surface source source.hgv source.maxspeed start_date
27096547 <NA> <NA> <NA> <NA> <NA> <NA>
28906993 <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> <NA> Tartu City Government <NA> <NA> <NA>
29420431 <NA> <NA> <NA> <NA> <NA> <NA>
29420432 <NA> <NA> <NA> <NA> <NA> <NA>
step_count surface tactile_paving tracktype tunnel turn.lanes turn.lanes.forward wheelchair wikidata
27096547 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
28906993 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394188 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394203 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394205 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394283 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394711 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29394713 <NA> asphalt <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420431 <NA> sett <NA> <NA> <NA> <NA> <NA> <NA> <NA>
29420432 <NA> concrete <NA> <NA> <NA> <NA> <NA> <NA> <NA>
wikipedia geometry
27096547 <NA> LINESTRING (26.70905 58.379...
28906993 <NA> LINESTRING (26.73056 58.379...
29394188 <NA> LINESTRING (26.72028 58.373...
29394203 <NA> LINESTRING (26.7261 58.3863...
29394205 <NA> LINESTRING (26.72647 58.385...
29394283 <NA> LINESTRING (26.73931 58.369...
29394711 <NA> LINESTRING (26.73036 58.379...
29394713 <NA> LINESTRING (26.73056 58.379...
29420431 <NA> LINESTRING (26.725 58.38056...
29420432 <NA> LINESTRING (26.72539 58.380...
Saadavates andmetes on palju müra kuna on arvestatud igasuguste võimalike annotatsioonidega (seega on tabel lai) ja on kokku pandud palju erinva klassiga teesid. Seetõttu tasub andmeid enne joonistamist filtreerida. Hea ülevaate erinevatest tee tüüpidest saab https://wiki.openstreetmap.org/wiki/Key:highway.
Sarnaselt saab alla laadida administratiivsed üksused. Need aga tulevad mitmes tasandis (riik, osariik, maakond, vald, küla, …) . Mis on antud tunnusega admin_level. Eesti puhul on admin_level jaotunud umbes järgmiselt.
2 - riik
6 - maakond
7 - vald
8 - linn
9 - külad, linnaosad
10 - asumid
piirid = opq(getbb("Tallinn")) %>%
add_osm_feature(key = "boundary", value = "administrative") %>%
osmdata_sf() %>%
unname_osmdata_sf()
piirid$osm_multipolygons %>%
filter(admin_level == 8) %>%
ggplot() +
geom_sf()
piirid$osm_multipolygons %>%
filter(admin_level == 9) %>%
ggplot() +
geom_sf()
piirid$osm_multipolygons %>%
filter(admin_level == 10) %>%
ggplot() +
geom_sf()
Tõmbame all ka veekogud ja joonistame need kaardile. Kuna veekogud tulevad nii joonte, polügonide kui multipolügonidena, peame neid joonistama ka mitmes kihis.
vesi = opq(getbb("Tartu kesklinn")) %>%
add_osm_feature(key = "water") %>%
osmdata_sf() %>%
unname_osmdata_sf()
ggplot() +
geom_sf(color = "lightblue", data = vesi$osm_lines) +
geom_sf(fill = "lightblue", data = vesi$osm_polygons) +
geom_sf(fill = "lightblue", data = vesi$osm_multipolygons)
Nagu näha on tihti probleemiks, et objektid ulatuvad kaugele algest ümbritsevast kastist välja seetõttu võib seda ümbritseva kasti koordinaadid anda ette ka funktsioonidele xlim ja ylim.